package com.eastfair.projectcore.service;

import com.eastfair.projectcore.dto.MenuDTO;
import com.eastfair.projectcore.dto.MenuSaveDTO;
import com.eastfair.projectcore.dto.MenuUpdateDTO;
import com.eastfair.projectcore.entity.Menu;
import com.eastfair.projectcore.enumeration.MenuTerminalTypeEnum;
import com.eastfair.projectcore.vo.MenuVO;
import com.eastfair.boot.service.SuperService;
import com.eastfair.core.base.R;

import java.util.List;

/**
 * <p>
 * 业务接口
 * 菜单
 * </p>
 *
 * @author ligang
 * @date 2021-07-22
 */
public interface MenuService extends SuperService<Menu> {

    /**
     * 删除,并删除旗下所有子菜单
     * @param id 主键id
     * @return
     */
    R del(Long id);

    /**
     * 删除子节点
     * @param menu 菜单
     * @return
     */
     R delChild(Menu menu);


    /**
     * 获取排序值
     * @param parentId 父级id
     * @return
     */
     int querySort(Long parentId);

    /**
     * 获取code值
     * @param menu 菜单
     * @return
     */
    String queryCode(Menu menu);

    /**
     * 排序置顶
     * @param id 主键id
     * @param id
     */
    public void sortTop(Long id);


    /**
     * 初始化排序
     * @param parentId 父级id
     * @return
     */
    public void initSort(Long parentId);

    /**
     * 查询code相关的所有信息
     * @param rightCodes  右关联code  code%
     * @param leftCodes   左关联code   %code
     * @return
     */
    List<Menu> queryAllOfCode(List<String> rightCodes, List<String> leftCodes,MenuDTO menuDTO);


    /**
     * 查询code相关的所有信息数量
     * @param code code码
     * @return
     */
    int queryCodeSize(String code);

    /**
     * 加载数据成树状结构
     * @param parentCode 根code码
     * @param menuVOList 菜单vo集合
     * @return
     */
    MenuVO loadTree(String parentCode, List<MenuVO> menuVOList);


    /**
     * 创建菜单节点
     *
     * @param menuSaveDTO 菜单新增实体
     * @return
     */
    R<Menu> createMenu(MenuSaveDTO menuSaveDTO);

    /**
     * 修改菜单节点
     *
     * @param menuUpdateDTO 菜单修改实体
     * @return
     */
    R<Menu> updateMenu(MenuUpdateDTO menuUpdateDTO);

    /**
     * 查询子集菜单信息，只查一层子集
     * @param parentId 父级id
     * @return
     */
    List<Menu> queryEntityOfParentId(Long parentId);

    /**
     * 查询菜单信息和全部子信息
     *
     * @param id 主键id
     * @return
     */
    /**
     * 查询菜单信息和全部子信息
     * @param id  主键id
     * @return
     */
    MenuVO findAllById(Long id);


    /**
     * 查询左侧菜单信息(包含菜单，目录)
     * @param id 菜单id
     * @return
     */
    MenuVO findAllByIdNoButton(Long id);


    /**
     * 清空父级菜单的动作信息
     * @param parentId 父级id
     * @return
     */
    void clearParentNodeData(Long parentId);


    /**
     * 通过子菜单查询菜单信息和全部子信息
     * @param childIds 子集菜单id集合
     */
    List<MenuVO> findAllByChildId(List<Long> childIds);


    /**
     * 查询按钮权限集合
     * @return
     */
    List<String> findButtonPermission();

    /**
     * 通过子菜单查询菜单的权限标识
     * @param childIds
     * @return
     */
    List<String> findPermissionAllByChildId(List<Long> childIds);


}
